package com.zzl.springboot_mybatis_demo.controller.user;

import com.gitee.yongzhuzl.commonutil.util.map.MapUtil;
import com.github.pagehelper.PageInfo;
import com.zzl.springboot_mybatis_demo.aspect.SetCreateTime;
import com.zzl.springboot_mybatis_demo.entity.common.CommonEntity;
import com.zzl.springboot_mybatis_demo.entity.user.User;
import com.zzl.springboot_mybatis_demo.service.user.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;

/**
 * Description：用户Controller
 * Created by 朱正磊 on 2019-06-16 16:43
 */
@Slf4j
@Controller
@RequestMapping("/api/user")
public class UserController {

    @Resource
    private UserService userService;

    /**
     * description：根据主键查询唯一数据
     * user 朱正磊
     * time 2019-06-16 17:09
     * @param id 主键
     * @return 返回响应数据
     */
    @GetMapping("/findUser/{id}")
    @ResponseBody
    public String findUser(@PathVariable("id") Integer id) {
        String result = userService.findUserById(id).toString();
        System.out.println(result);
        return result;
    }

    /**
     * description：根据主键查询唯一数据
     * user 朱正磊
     * time 2019-06-16 17:09
     * @param id 主键
     * @return 返回响应数据
     */
    @GetMapping("/findUser2/{id}")
    @ResponseBody
    public User findUser2(@PathVariable("id") Integer id) {
        User user = userService.findUserById(id);
        System.out.println(user);
        return user;
    }

    /**
     * description：根据主键查询唯一数据
     * user 朱正磊
     * time 2019-06-16 17:09
     * @param id 主键
     * @return 返回响应数据
     */
    @GetMapping("/findUser3/{id}")
    @ResponseBody
    public List<User> findUser3(@PathVariable("id") Integer id) {
        List<User> list = userService.findUserByUserId(id);
        System.out.println(list);
        return list;
    }

    /**
     * description：获取我的配置文件属性内容信息
     * user 朱正磊
     * time 2019-06-16 22:06
     * @return 返回配置信息
     */
    @GetMapping("/getMyowner")
    @ResponseBody
    public String getMyowner() {
        return userService.getMyowner();
    }

    /**
     * 仅仅获取业务数据
     * description：分页查询所有的用户信息
     * user 朱正磊
     * time 2019-06-16 23:27
     * @param pageNum 开始页数，不必须传，不传默认为1
     * @param pageSize 每页显示的数据条数，不必须传，不传默认为10
     * @return 返回响应数据（json格式）
     */
    @GetMapping("/findAll")
    @ResponseBody
    public Object findAll(@RequestParam(value = "pageNum", required = false, defaultValue = "1") Integer pageNum,
                          @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize) {
        List<User> userList = userService.findAll(pageNum, pageSize);
        log.info("调用接口查询用户分页数据成功！userList = {}", userList);
        return userList;
    }

    /**
     * 获取分页信息以及业务数据
     * description：分页查询所有的用户信息
     * user 朱正磊
     * time 2019-06-16 23:27
     * @param pageNum 开始页数，不必须传，不传默认为1
     * @param pageSize 每页显示的数据条数，不必须传，不传默认为10
     * @return 返回响应数据（json格式）
     */
    @GetMapping("/findAll2")
    @ResponseBody
    public Object findAll2(@RequestParam(value = "pageNum", required = false, defaultValue = "1") Integer pageNum,
                           @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize) {
        PageInfo<User> pageInfo = userService.findAll2(pageNum, pageSize);
        log.info("调用接口查询用户分页数据成功！pageInfo = {}", pageInfo);
        return pageInfo;
    }

    /**
     * description：使用thymeleaf模板引擎渲染数据
     * user 朱正磊
     * time 2019-08-17 19:01
     * @param map 响应数据
     * @return 返回逻辑视图
     */
    @RequestMapping("/getUserList")
    public ModelAndView getUserList(Map<String, Object> map) {
        List<User> userList = userService.findAll(1, 10);
        map.put("userList", userList);
        return new ModelAndView("user/list", map);
    }

    /**
     * description：仅仅测试@NonNull和@Nullable的使用
     * user 朱正磊
     * time 2019-06-16 22:06
     * @return 返回响应数据
     */
    @GetMapping("/testNonNull")
    @ResponseBody
    public String testNonNull() {
        //return userService.testNonNull(null, null);
        return userService.testNonNull("刘德华", "123456");
    }

    /**
     * description: 模拟自定义注解@SetCreateTime的使用
     * @author 朱正磊
     * @date 2019-09-04 10:51:27
     * @param request 请求对象
     * @return 返回响应对象
     */
    @PostMapping("/addUser")
    @ResponseBody
    public CommonEntity addUser(HttpServletRequest request) {
        Map<String, Object> paramsMap = MapUtil.getParamsMap(request);
        try {
            User user = MapUtil.getJavaBeanByMap(paramsMap, User.class);
            userService.addUser(user);
            return CommonEntity.build(200, "调用接口成功！");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return CommonEntity.build(400, "调用接口失败！");
    }

    /**
     * description：测试springmvc默认响应的异常json数据
     * user 朱正磊
     * time 2019-09-14 19:11
     * @return 返回响应对象
     */
    @PostMapping("/getError")
    @ResponseBody
    public CommonEntity getError() {
        //int i = 1 / 0;

        Object o = "abc";
        Integer i = (Integer) o;

        return CommonEntity.build(400, "接口异常！");
    }

    /**
     * description：利用自定义注解@SetCreateTime测试自定义响应异常
     * user 朱正磊
     * time 2019-09-14 19:37
     * @return 返回响应对象
     */
    @PostMapping("/getResponseException")
    @ResponseBody
    @SetCreateTime
    public CommonEntity getResponseException() {
        return CommonEntity.build(400, "接口异常！");
    }

}
